package com.hex.ds.hdrs.engine.service;

import com.hex.ds.hdrs.agent.service.AgentManager;
import com.hex.ds.hdrs.common.constant.Const;
import com.hex.ds.hdrs.engine.manager.RunningManager;
import com.hex.ds.hdrs.engine.manager.ToDoManager;
import com.hex.ds.hdrs.engine.manager.ToRunManager;
import com.hex.ds.hdrs.period.job.po.JobTask;
import com.hex.ds.hdrs.period.task.po.PeriodTask;
import com.hex.ds.hdrs.watch.service.ScheduledService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * @Package: com.hex.ds.hdrs.engine.service
 * @ClassName HandService
 * @Description: 手工界面修改，更新 内存服务层
 * @Author: jd.chen
 * @Date 2021/7/8 18:46
 * @Version v1.0
 **/
@Service
@Slf4j
public class HandService {

    @Autowired
    private ToDoManager toDoManager;
    @Autowired
    private ToRunManager toRunManager;
    @Autowired
    private RunningManager runningManager;
    @Autowired
    private AgentManager agentManager;
    @Autowired
    private ScheduledService scheduledService;

    /**
     * @Method: getJobTask
     * @Param: [jobCode]
     * @Return: com.hex.ds.hdrs.period.job.po.JobTask
     * @Description：
     * @Author： jd.chen
     * @Date： 2021/7/8 18:46
     * @Version： V1.0
     */
    public JobTask getJobTask(String jobCode, String bizDate) {
        boolean toDoFlag = toDoManager.isContainsJob(jobCode);
        if (toDoFlag) {
            return this.checkBizDate(toDoManager.getJob(jobCode), bizDate);
        }
        boolean toRunFlag = toRunManager.isContainsJob(jobCode);
        if (toRunFlag) {
            return this.checkBizDate(toRunManager.getJob(jobCode), bizDate);
        }
        boolean runningFlag = runningManager.isContainsJob(jobCode);
        if (runningFlag) {
            return this.checkBizDate(runningManager.getJob(jobCode), bizDate);
        }
        return null;
    }

    /**
     * @Method: checkBizDate
     * @Param: [jobTask, bizDate]
     * @Return: com.hex.ds.hdrs.period.job.po.JobTask
     * @Description： 检查业务日期是否相等
     * @Author： jd.chen
     * @Date： 2021/7/8 20:02
     * @Version： V1.0
     */
    public JobTask checkBizDate(JobTask jobTask, String bizDate) {
        return bizDate.equals(jobTask.getBizDate()) ? jobTask : null;
    }

    /**
     * @Method: upTaskToDo
     * @Param: [jobCode, bizDate, taskCode, upTs]
     * @Return: void
     * @Description： 更新任务状态--待处理
     * @Author： jd.chen
     * @Date： 2021/7/8 21:10
     * @Version： V1.0
     */
    public void upTaskToDo(String jobCode, String bizDate, String taskCode, String upTs) {
        JobTask jobTask = getJobTask(jobCode, bizDate);
        if (jobTask == null) {
            return;
        }
        log.info("更新任务状态--待处理,任务编码：{},业务日期：{}",jobCode,bizDate);
        jobTask.upTaskStatusToDo(taskCode, upTs);
        String jobStatus = jobTask.getJobStatus();
        if (Const.JOB_DO_SUCCESS.equals(jobStatus)) {
            jobTask.updateJobStatus(upTs, Const.JOB_TO_DO);
        }
    }

    /**
     * @Method: upToDoTaskToHandSucc
     * @Param: [jobCode, bizDate, taskCode, upTs]
     * @Return: void
     * @Description： 更新待处理任务状态--
     * @Author： jd.chen
     * @Date： 2021/7/8 21:10
     * @Version： V1.0
     */
    public void upToDoTaskToHandSucc(String jobCode, String bizDate, String taskCode, String upTs) {
        JobTask jobTask = getJobTask(jobCode, bizDate);
        if (jobTask == null) {
            return;
        }
        log.info("更新待处理任务状态,任务编码：{},业务日期：{}",jobCode,bizDate);
        jobTask.upTaskStatusToHandSucc(taskCode, upTs);
        if (jobTask.isAllTaskSucc()) {
            jobTask.upJobStatusToSucc(upTs);
        }

    }

    /**
     * @Method: upTaskToStop <br>
     * @Param: [jobCode, bizDate, taskCode, upTs] <br>
     * @Return: void <br>
     * @Description：更新任务状态--暂停<br>
     * @Author： gc.zuo<br>
     * @Date： 2022/1/26 13:54 <br>
     * @Version： V1.0<br>
     */
    public void upTaskToStop(String jobCode, String bizDate, String taskCode, String upTs) {
        JobTask jobTask = getJobTask(jobCode, bizDate);
        if (jobTask == null) {
            return;
        }
        log.info("更新任务状态--暂停,任务编码：{},业务日期：{}",jobCode,bizDate);
        jobTask.upTaskStatusToStop(taskCode, upTs);
        String jobStatus = jobTask.getJobStatus();
        if (Const.JOB_DO_SUCCESS.equals(jobStatus)) {
            jobTask.upJobStatusToDo(upTs);
        }
    }

    /**
     * @Method: touchNextTask <br>
     * @Param: [jobCode, bizDate, taskCode] <br>
     * @Return: void <br>
     * @Description：置虚后触发作业的下个任务<br>
     * @Author： gc.zuo<br>
     * @Date： 2022/4/27 9:57 <br>
     * @Version： V1.0<br>
     */
    public void touchNextTask(String jobCode, String bizDate, String taskCode) {
        JobTask jobTask = getJobTask(jobCode, bizDate);
        if (jobTask == null) {
            return;
        }
        log.info("置虚后触发作业的下个任务,任务编码：{},业务日期：{}",jobCode,bizDate);
        String nextTaskCode = jobTask.getNextTaskCode(taskCode);
        PeriodTask downTask = jobTask.getTask(nextTaskCode);
        toRunManager.addTaskToRunQueue(jobTask, downTask);
    }

    /**
     * @Method: removeToDoTask <br>
     * @Param: [jobCode, bizDate] <br>
     * @Return: void <br>
     * @Description：去除待处理队列中的任务<br>
     * @Author： gc.zuo<br>
     * @Date： 2022/5/9 10:14 <br>
     * @Version： V1.0<br>
     */
    public void removeToDoTask(String jobCode, String bizDate) {
        if (toDoManager.isContainsJob(jobCode) && toDoManager.getJob(jobCode).getBizDate().equals(bizDate)) {
            log.info("去除待处理队列中的任务,任务编码：{},业务日期：{}",jobCode,bizDate);
            toDoManager.removeJob(toDoManager.getJob(jobCode));
        }
    }

    /**
     * @Method: removeToRunJob <br>
     * @Param: [task, type] <br>
     * @Return: void <br>
     * @Description：去除可执行队列中的任务<br>
     * @Author： gc.zuo<br>
     * @Date： 2022/5/10 7:20 <br>
     * @Version： V1.0<br>
     */
    public void removeToRunJob(String jobCode, String bizDate, String type) {
        if (toRunManager.isContainsJob(jobCode) && toRunManager.getJob(jobCode).getBizDate().equals(bizDate)){
            log.info("去除可执行队列中的任务,任务编码：{},业务日期：{}",jobCode,bizDate);
            toRunManager.removeJob(toRunManager.getJob(jobCode).getCurTask(), type);
        }
    }

    /*
     * @Method: removeToRunningJob <br>
     * @Param: [task, type] <br>
     * @Return: void <br>
     * @Description：删除执行中的任务<br>
     * @Author： wz.li<br>
     * @Date： 2022/12/11 15:37 <br>
     * @Version： V2.0.2<br>
     */
    public void removeToRunningJob(String jobCode, String bizDate, String type) {
        if (runningManager.isContainsJob(jobCode)
                && runningManager.getJob(jobCode).getBizDate().equals(bizDate)) {
            log.info("删除执行中的任务,任务编码：{},业务日期：{}",jobCode,bizDate);
            PeriodTask periodTask = runningManager.getJob(jobCode).getCurTask();
            runningManager.removeJob(periodTask, type);
            scheduledService.delTaskInSession(periodTask);
        }
    }
}
